#ifndef TANAMAN_H
#define	TANAMAN_H

class Tanaman {
protected:
    int HappyMeter;
    int TitikDewasa;
    int TitikPanen;
    struct Posisi {
        int x;
        int y;
    };
    struct Posisi Position;
    int Age;
    int NHarvested;
//    int PriceBibit;
//    int PriceJual;
    int Musimable;
/*       0 : Semi
         1 : Panas
         2 : Gugur
         3 : Salju
         4 : Semua musim
         5 : Semi + Panas
         6 : Panas + Gugur
*/
    int KodeTanaman;
/*       9 : ChronoPlant
         10 : ReynFruit
         11 : Ichalmond
         12 : Edondong
         13 : GreenAlgoe
         14 : Hanselnut
         15 : AbelTree
         16 : Elmonade
 */
    
public:
//    Tanaman operator =(Tanaman);

    Tanaman();

    Tanaman(const Tanaman&);
    
    ~Tanaman();

//    virtual static void EatEffect() = 0;
//    void SetPosition (int,int,char);

/*   SetPosition
        Mengakses class Lahan
        Dilakukan saat Player menanam tanaman (Put)
*/
    void SetHappyMeter (int);
/*   SetHappyMeter
        Mengakses class Lahan
        Mengakses class Time
        Bertambah jika status berupa ‘Watered’ pada pergantian hari
        Berkurang jika dipanen (fungsi Harvested)
*/
    void Harvested ();
/*   Harvested
        Mengakses class Lahan
        Mengurangi HappyMeter
        Mengakses class Inventory, karena menambah inventory player
        Mengurangi TitikPanen (penyelesaian bonus no.2)
*/

    void DecAge ();
/*   DecAge
        Mengakses class Time
        Berkurang tiap pergantian hari
        Mengakses class Lahan
        Mengubah status Lahan menjadi ‘Dead’ Jika Age habis -> mendingan ngapus tanaman dari lahan
*/
    int CheckHappyMeter ();
/*   CheckHappyMeter
    Mengembalikan nilai Happy Meter dan status Panen dari tanaman
*/
//    virtual void EatEffect() = 0;
    int GetKodeTanaman ();
/*   GetKodeTanaman
     Mengembalikan atribut KodeTanaman
*/
    int GetNHarvested();
/*   GetNHarvested
     Mengembalikan atribut NHarvested
*/
    int GetAge();

    int GetMusimable();

    void SetAge(int);
/*
 GetAge
 Mengembalikan atribut Age
 */

    int GetTitikPanen();

    void SetTitikPanen(int);

    void SetNHarvested(int);
};

   class ChronoPlant: public Tanaman {
       
    public:
       ChronoPlant(int,int);
       ~ChronoPlant();
       static void EatEffect();
//      void Show();
   };

   class ReynFruit: public Tanaman {
       
    public:
       ReynFruit(int,int);
       ~ReynFruit();
       static void EatEffect();
   };

   class Ichalmond: public Tanaman {
       
    public:
       Ichalmond(int,int);
       ~Ichalmond();
       static void EatEffect();
   };

   class Edondong: public Tanaman {
       
    public:
       Edondong(int,int);
       ~Edondong();
       static void EatEffect();
   };

   class GreenAlgoe: public Tanaman {
       
    public:
       GreenAlgoe(int,int);
       ~GreenAlgoe();
       static void EatEffect();
   };

   class Hanselnut: public Tanaman {
      
    public:
       Hanselnut(int,int);
       ~Hanselnut();
       static void EatEffect();
   };

   class AbelTree: public Tanaman {
       
    public:
       AbelTree(int,int);
       ~AbelTree();
       static void EatEffect();
   };

   class Elmonade: public Tanaman {
       
    public:
       Elmonade(int,int);
       ~Elmonade();
       static void EatEffect();
   };

#endif	/* TUBESOOP1_H */
